#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>



//进程的非阻塞等待方式
int main()
{
  pid_t pid = fork();
  if(pid<0)
  {
    printf("$s fork error\n",__FUNCTION__);
    return 1;
  }
  else if(pid==0)
  {
    //child
    printf("child is run,pid is : %d\n",getpid());
    sleep(5);
    exit(1);
  }
  else 
  {
    int status = 0;
    pid_t ret = 0;
    do{
      ret = waitpid(-1,&status,WNOHANG);//非阻塞等待
      if(ret == 0)
      {
        printf("child is running\n");
      }
      sleep(1);
    }while(ret==0);
    
    if(WIFEXITED(status) && ret==pid)
    {
      printf("wait child 5s success,child return code is : %d\n",WEXITSTATUS(status));
    }
    else{
      printf("wait child failed,return \n");
      return 1;
    }
  }
  return 0;
}






















////进程阻塞等待方式
//int main()
//{
//  pid_t pid = fork();
//  if(pid<0)
//  {
//    printf("%s fork error\n",__FUNCTION__);
//    return 1;
//  }else if(pid==0)
//  {
//    //child
//    printf("child is run ,pid is : %d\n",getpid());
//    sleep(5);
//    exit(257);
//  }
//  else 
//  {
//    //parent
//    int status = 0;
//    pid_t ret = waitpid(-1,&status,0);//阻塞式等待任意子进程，等待5秒
//    printf("this is test for wait\n");
//    if(WIFEXITED(status) && ret == pid)
//    {
//      printf("wait child 5s success,child return code is : %d\n",WEXITSTATUS(status));
//    }
//    else 
//    {
//      printf("wait child failed,return\n");
//      return 1;
//    }
//  }
//  
//  return 0;
//}
//

//获取进程的statue
//int main()
//{
//  pid_t pid = fork();
//
//  if(pid==-1)
//  {
//    //fork fail
//    perror("fork");
//    exit(1);
//  }
//
//  if(pid==0)
//  {
//    //child
//    sleep(20);
//    exit(10);
//  }
//  else
//  {
//    //parent
//    int statue;
//    int ret = wait(&statue);
//
//    if(ret>0 && (statue & 0X7F)==0)
//    {
//      //正常退出
//      printf("child exit code : %d\n",(statue>>8)&0XFF);
//    }
//    else if(ret>0)
//    {
//      //异常退出
//      printf("signal code : %d\n",statue & 0X7F);
//    }
//  }
//  return 0;
//}
